/**
 *	@file	radio_cm.c
 *	@brief	ラジオ　CMデータ生成
 *	@author	Miyuki Iwasawa
 *	@date	09.04.17
 */

#include "common.h"
#include "system/procsys.h"
#include "system/arc_util.h"
#include "system/arc_tool.h"
#include "system/bmp_list.h"
#include "system/bmp_menu.h"
#include "system/pm_str.h"
#include "system/msgdata.h"
#include "system/fontproc.h"
#include "system/snd_tool.h"
#include "system/buflen.h"
#include "system/wordset.h"
#include "system/pm_rtc.h"
#include "application/app_tool.h"
#include "msgdata/msg.naix"

#include "field/evwkdef.h"
#include "field/sysflag.h"
#include "field/sysflag_def.h"
#include "fielddata/script/saveflag.h"
#include "savedata/zukanwork.h"
#include "radio_prog.h"
#include "msgdata/msg_pg_radio.h"
#include "msgdata/msg_radio_p_cm.h"

#define CM_DATA_MAX	(36)
#define RADIO_CH_ALL	(0xFF)

enum{
 FLAG_NONE,
 FLAG_ZUKAN,
 FLAG_KOGANE,
 FLAG_ENJU,
 FLAG_ASAGI,
 FLAG_DENDOU,
 FLAG_KUTIBA,
 FLAG_LINEAR,
 FLAG_MAX,
};

enum{
 AREA_JOHTO = 1,
 AREA_KANTO = 2,
 AREA_BOTH = 3,
};

typedef struct _CM_DATA{
	u8	flag_id;
	u8	area_f;
	u8	ch_id;
}CM_DATA;

typedef struct{
 int heapID;
 u16 seq;
 u16 msg_id;
 u8	flag[FLAG_MAX];
 u8	cm[CM_DATA_MAX];
}RADIO_CM_WORK;

static void cm_ResInit(PM_RADIO_MAN* man);
static void cm_ResRelease(PM_RADIO_MAN* man);


static const CM_DATA DATA_CMTable[CM_DATA_MAX] = {
 { FLAG_NONE,	AREA_BOTH,	RADIO_CH_ALL },	//01	ポケモンセンター
 { FLAG_NONE,	AREA_BOTH,	RADIO_CH_ALL },	//02	フレンドリィショップ
 { FLAG_NONE,	AREA_BOTH,	RADIO_CH_ALL },	//03	ポケギア（シルフカンパニー）
 { FLAG_NONE,	AREA_BOTH,	RADIO_CH_ALL },	//04	ポケモンリーグ広報（トレーナー編）
 { FLAG_NONE,	AREA_BOTH,	RADIO_CH_ALL },	//05	ポケモンリーグ広報（連れ歩き編）
 { FLAG_NONE,	AREA_JOHTO,	RADIO_CH_ALL },	//06	ジョウト観光協会（マダツボミの塔編）
 { FLAG_NONE,	AREA_JOHTO,	RADIO_CH_ALL },	//07	ジョウト観光協会（アルフの遺跡編）
 { FLAG_NONE,	AREA_JOHTO,	RADIO_CH_ALL },	//08	ジョウト観光協会（歌舞連場編）
 { FLAG_NONE,	AREA_JOHTO,	RADIO_CH_ALL },	//09	ジョウト観光協会（アサギの灯台編）
 { FLAG_NONE,	AREA_BOTH,	RADIO_CH_TOWN },	//10	ボンジュース
 { FLAG_NONE,	AREA_BOTH,	RADIO_CH_TOWN },	//11	ダッシューズ
 { FLAG_ZUKAN,	AREA_BOTH,	RADIO_CH_ALL },	//12	ポケモンセンター（通信編）
 { FLAG_ZUKAN,	AREA_BOTH,	RADIO_CH_ALL },	//13	ポケモンセンター（Wi-Fi編）
 { FLAG_ZUKAN,	AREA_BOTH,	RADIO_CH_ALL },	//14	グローバルタワー
 { FLAG_ZUKAN,	AREA_BOTH,	RADIO_CH_ALL },	//15	Wi-Fiひろば
 { FLAG_KOGANE,	AREA_JOHTO,	RADIO_CH_MULTI },	//16	コガネデパート（コガネ）
 { FLAG_KOGANE,	AREA_JOHTO,	RADIO_CH_MULTI },	//17	ゲームコーナー（コガネ）
 { FLAG_KOGANE,	AREA_JOHTO,	RADIO_CH_MULTI },	//18	ラジオ局（コガネ）
 { FLAG_KOGANE,	AREA_JOHTO,	RADIO_CH_TOWN },	//19	ポケスロン参加
 { FLAG_KOGANE,	AREA_JOHTO,	RADIO_CH_TOWN },	//20	ポケスロン主題歌ＣＤ
 { FLAG_KOGANE,	AREA_BOTH,	RADIO_CH_TOWN },	//21	自然公園（虫取り大会）
 { FLAG_ENJU,	AREA_BOTH,	RADIO_CH_TOWN },	//22	サファリゾーン（タンバ）
 { FLAG_ENJU,	AREA_JOHTO,	RADIO_CH_MULTI },	//23	名物いかりまんじゅう（チョウジ）
 { FLAG_ASAGI,	AREA_BOTH,	RADIO_CH_POKEMON },	//24	バトルタワー
 { FLAG_ASAGI,	AREA_BOTH,	RADIO_CH_POKEMON },	//25	Wi-Fiバトルタワー
 { FLAG_ASAGI,	AREA_BOTH,	RADIO_CH_POKEMON },	//26	バトルステージ
 { FLAG_ASAGI,	AREA_BOTH,	RADIO_CH_POKEMON },	//27	バトルキャッスル
 { FLAG_ASAGI,	AREA_BOTH,	RADIO_CH_POKEMON },	//28	バトルルーレット
 { FLAG_ASAGI,	AREA_BOTH,	RADIO_CH_POKEMON },	//29	バトルファクトリー
 { FLAG_DENDOU,	AREA_BOTH,	RADIO_CH_MULTI },	//30	アクア号
 { FLAG_KUTIBA,	AREA_KANTO,	RADIO_CH_MULTI },	//31	サイクリングロード
 { FLAG_KUTIBA,	AREA_KANTO,	RADIO_CH_MULTI },	//32	ポケモンリーグ広報（カントー編）
 { FLAG_KUTIBA,	AREA_KANTO,	RADIO_CH_MULTI },	//33	グレンジム
 { FLAG_KUTIBA,	AREA_KANTO,	RADIO_CH_MULTI },	//34	カントーラジオ局
 { FLAG_KUTIBA,	AREA_KANTO,	RADIO_CH_MULTI },	//35	シルフカンパニー（ヤマブキ）
 { FLAG_LINEAR,	AREA_BOTH,	RADIO_CH_MULTI },	//36	リニアモーターカー
};

/**
 *	@brief	ラジオ　CM　初期化
 */
int RadioCM_Init(PM_RADIO_MAN* man)
{
	RADIO_CM_WORK* wk = NULL;

	wk = sys_AllocMemory(man->heapID,sizeof(RADIO_CM_WORK));
	MI_CpuClear8(wk,sizeof(RADIO_CM_WORK));

	man->cm_req_f = FALSE;
	man->ch_wk = (void*)wk;

	cm_ResInit(man);
	return 0;
}

/**
 *	@brief	ラジオ　CM 解放
 */
int RadioCM_End(PM_RADIO_MAN* man)
{
	cm_ResRelease(man);

	MI_CpuClear8(man->ch_wk,sizeof(RADIO_CM_WORK));
	sys_FreeMemoryEz(man->ch_wk);
	man->ch_wk = NULL;

	return 0;
}

/**
 *	@brief	ラジオ　CM 再生メイン
 */
int RadioCM_Play(PM_RADIO_MAN* man)
{
	RADIO_CM_WORK* wk = (RADIO_CM_WORK*)man->ch_wk;

	switch(wk->seq){
	case 0:	//CM再生
		RadioSub_SentencePlayEx(man,wk->msg_id,TRUE);
		wk->seq++;
		break;
	case 1:
		if(!RadioSub_SentencePlayWait(man)){
			break;
		}
		wk->seq++;
		break;
	case 2:
		if(!RadioSub_TimeWait(man)){
			break;
		}
		return 1;
	}
	return 0;
}

/*
 *	@brief	CM用 必要なデータを初期化する
 */
static void cm_ResInit(PM_RADIO_MAN* man)
{
	u8 num = 0,i;
	const CM_DATA* pd;
	EVENTWORK* ev_sv;
	RADIO_CM_WORK* wk = (RADIO_CM_WORK*)man->ch_wk;

	man->msg_prog = MSGMAN_Create(MSGMAN_TYPE_NORMAL,ARC_MSG,NARC_msg_radio_p_cm_dat,man->heapID);

	//番組タイトルとDJ名を通知
	MSGMAN_GetString(man->msg_prog,m_cm_title,man->str_title);
	STRBUF_Clear(man->str_dj);

	//フラグ取得
	MI_CpuClear8(wk->flag,sizeof(u8)*FLAG_MAX);
	MI_CpuClear8(wk->cm,sizeof(u8)*CM_DATA_MAX);

	ev_sv = SaveData_GetEventWork(man->save);
	wk->flag[FLAG_NONE] = TRUE;	//無条件
	wk->flag[FLAG_ZUKAN] =EventWork_CheckEventFlag( ev_sv, FE_ZUKAN_GET );
	wk->flag[FLAG_KOGANE] = SysFlag_Arrive( ev_sv, SYSFLAG_MODE_CHECK, FLAG_ARRIVE_T25);
	wk->flag[FLAG_ENJU] = SysFlag_Arrive( ev_sv, SYSFLAG_MODE_CHECK, FLAG_ARRIVE_T27);
	wk->flag[FLAG_ASAGI] = SysFlag_Arrive( ev_sv, SYSFLAG_MODE_CHECK, FLAG_ARRIVE_T26);
	wk->flag[FLAG_KUTIBA] = SysFlag_Arrive( ev_sv, SYSFLAG_MODE_CHECK, FLAG_ARRIVE_T06);
	wk->flag[FLAG_DENDOU] = EventWork_CheckEventFlag( ev_sv, SYS_FLAG_GAME_CLEAR );
	wk->flag[FLAG_LINEAR] = EventWork_CheckEventFlag( ev_sv, FE_HATSUDENSYO_CLEAR );

	//CM候補チェック
	for(i = 0;i < CM_DATA_MAX;i++){
		pd = &DATA_CMTable[i];
		if(	(!wk->flag[pd->flag_id]) ||
			((pd->ch_id != RADIO_CH_ALL) && (pd->ch_id != man->ch_id))){
			continue;
		}
		if(!(((u8)man->is_kanto_f+1) & pd->area_f)){
			continue;
		}
		wk->cm[num++] = i;
	}
	wk->msg_id = wk->cm[gf_rand()%num] + m_cm_01;
}

/**
 *	@brief	CM用　リソース解放
 */
static void cm_ResRelease(PM_RADIO_MAN* man)
{
	RADIO_CM_WORK* wk = (RADIO_CM_WORK*)man->ch_wk;

	MSGMAN_Delete(man->msg_prog);
}
